package com.aspire.aimini.repository;

import com.aspire.aimini.model.entity.AiConfig;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * AI配置Repository接口
 *
 * @author wangguiyou
 * @date 2024-01-01
 * @description AI配置数据访问层接口
 */
@Mapper
public interface AiConfigRepository extends BaseMapper<AiConfig> {

    /**
     * 分页查询AI配置列表
     *
     * @param page        分页对象
     * @param userId      用户ID
     * @param serviceType 服务类型
     * @param provider    提供商
     * @param status      状态
     * @return 分页结果
     */
    IPage<AiConfig> selectConfigPage(
            Page<AiConfig> page,
            @Param("userId") Long userId,
            @Param("serviceType") String serviceType,
            @Param("provider") String provider,
            @Param("status") Integer status);

    /**
     * 根据用户ID和服务类型查询配置
     *
     * @param userId      用户ID
     * @param serviceType 服务类型
     * @return 配置列表
     */
    List<AiConfig> selectByUserIdAndServiceType(@Param("userId") Long userId, @Param("serviceType") String serviceType);

    /**
     * 根据用户ID和服务类型查询默认配置
     *
     * @param userId      用户ID
     * @param serviceType 服务类型
     * @return 默认配置
     */
    AiConfig selectDefaultByUserIdAndServiceType(@Param("userId") Long userId,
            @Param("serviceType") String serviceType);

    /**
     * 根据服务类型查询系统默认配置
     *
     * @param serviceType 服务类型
     * @return 系统默认配置
     */
    AiConfig selectSystemDefaultByServiceType(@Param("serviceType") String serviceType);

    /**
     * 更新默认配置状态
     *
     * @param userId      用户ID
     * @param serviceType 服务类型
     * @param configId    配置ID
     * @return 更新数量
     */
    int updateDefaultConfig(@Param("userId") Long userId, @Param("serviceType") String serviceType,
            @Param("configId") Long configId);

    /**
     * 清除用户的默认配置
     *
     * @param userId      用户ID
     * @param serviceType 服务类型
     * @return 更新数量
     */
    int clearDefaultConfig(@Param("userId") Long userId, @Param("serviceType") String serviceType);

    /**
     * 增加今日使用量
     *
     * @param id     配置ID
     * @param amount 使用量
     * @return 更新数量
     */
    int incrementTodayUsed(@Param("id") Long id, @Param("amount") Integer amount);

    /**
     * 重置今日使用量
     *
     * @param id 配置ID
     * @return 更新数量
     */
    int resetTodayUsed(@Param("id") Long id);

    /**
     * 批量重置今日使用量
     *
     * @return 更新数量
     */
    int batchResetTodayUsed();

    /**
     * 检查配置是否可用
     *
     * @param id 配置ID
     * @return 是否可用
     */
    boolean isConfigAvailable(@Param("id") Long id);

    /**
     * 根据提供商查询配置列表
     *
     * @param provider 提供商
     * @param status   状态
     * @return 配置列表
     */
    List<AiConfig> selectByProvider(@Param("provider") String provider, @Param("status") Integer status);

    /**
     * 统计用户配置数量
     *
     * @param userId 用户ID
     * @return 配置数量
     */
    Long countByUserId(@Param("userId") Long userId);

    /**
     * 统计各服务类型配置数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<java.util.Map<String, Object>> countByServiceType(@Param("userId") Long userId);

    /**
     * 统计各提供商配置数量
     *
     * @return 统计结果
     */
    List<java.util.Map<String, Object>> countByProvider();

    /**
     * 查询即将达到配额限制的配置
     *
     * @param threshold 阈值(百分比)
     * @return 配置列表
     */
    List<AiConfig> selectNearQuotaLimit(@Param("threshold") Double threshold);

    /**
     * 查询已超出配额的配置
     *
     * @return 配置列表
     */
    List<AiConfig> selectOverQuota();

    /**
     * 删除用户的所有配置
     *
     * @param userId 用户ID
     * @return 删除数量
     */
    int deleteByUserId(@Param("userId") Long userId);
}